﻿using BLevy.Entidad;
using BLevy.Negocio;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmCobradorLiquidacion : Form
    {
        private List<CobradorCobro> cobrosL = new List<CobradorCobro>();
        public frmCobradorLiquidacion()
        {
            InitializeComponent();
        }

        private void IniciarControles()
        {
            txtCantidadCupones.Text = string.Empty;
            txtImporteCupones.Text = string.Empty;
            txtImportePagar.Text = string.Empty;

            dgvCupones.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

            txtImportePagar.Enabled = false;
            txtImporteCupones.Enabled = false;
            txtCantidadCupones.Enabled = false;
        }


        private void GetCobradores()
        {
            try
            {
                cmbCobrador.ValueMember = "id";
                cmbCobrador.DisplayMember = "nombre_completo";
                cmbCobrador.DataSource = Cobradores.FindAll().Where(x => x.id != 1).ToList();
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void frmCobradorLiquidacion_Load(object sender, EventArgs e)
        {
            IniciarControles();
            GetCobradores();
        }

        private void btnSeleccionarCupones_Click(object sender, EventArgs e)
        {
            error.Clear();

            frmCobradorPendientePagoSelector frm = new frmCobradorPendientePagoSelector(Convert.ToInt32(cmbCobrador.SelectedValue));
            frm.Text = "Cobros - " + cmbCobrador.Text + ": Cobros Pendientes de Pago.";
            DialogResult dialog = frm.ShowDialog();
            if (dialog == System.Windows.Forms.DialogResult.OK)
            {
                try
                {

                    List<CobradorCobro> _cobrosL = new List<CobradorCobro>();
                    _cobrosL = frm.cobrosL;
                    if (_cobrosL.Count > 0)
                    {
                        //dgvCupones.Rows.Clear();
                        foreach (var fila in _cobrosL)
                        {
                            //verifico si no existe ya en la grilla el cobro
                            if (VerificarCobro(fila.id) == true)
                            {
                                dgvCupones.Rows.Add(fila.id, fila.cobro.cupon.numero, fila.cobro.fecha.ToShortDateString(), fila.cobro.total,
                                    fila.cobrador_id, fila.cobrador.nombre_completo, fila.comision);

                                cobrosL.Add(fila);
                            }
                        }

                        CalcularTotales();
                        cmbCobrador.Enabled = false;
                    }
                    else
                    {
                        error.SetError(btnSeleccionarCupones, "Debe seleccionar Cobros a Liquidar.");
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void CalcularTotales()
        {
            try
            {
                double importe_cobrado = 0;
                double total_comision = 0;

                foreach (DataGridViewRow fila in dgvCupones.Rows)
                {
                    importe_cobrado = importe_cobrado + Convert.ToDouble(fila.Cells[3].Value);
                    total_comision = total_comision + Convert.ToDouble(fila.Cells[6].Value);
                }

                txtImporteCupones.Text = "$ " + importe_cobrado.ToString();
                txtCantidadCupones.Text = dgvCupones.Rows.Count.ToString();
                txtImportePagar.Text = "$ " + total_comision.ToString();
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void dgvCupones_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex.Equals(7))
                {
                    int fila = e.RowIndex;
                    dgvCupones.Rows.RemoveAt(fila);

                    cobrosL.RemoveAt(fila);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private Boolean VerificarCobro(int cobro_id)
        {
            bool resultado = true;
            try
            {
                foreach (DataGridViewRow fila in dgvCupones.Rows)
                {
                    if (Convert.ToInt32(fila.Cells[0].Value) == cobro_id)
                    {
                        resultado = false;
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            return resultado;
        }

        private Boolean ValidarForm()
        {
            bool resultado = true;
            error.Clear();

            if (dgvCupones.Rows.Count == 0)
            {
                resultado = false;
                error.SetError(btnSeleccionarCupones, "Debe agregar un detalle a la Liquidación.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtCantidadCupones.Text))
            {
                resultado = false;
                error.SetError(btnSeleccionarCupones, "Debe agregar un detalle a la Liquidación.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtImporteCupones.Text))
            {
                resultado = false;
                error.SetError(btnSeleccionarCupones, "Debe agregar un detalle a la Liquidación.");
                return resultado;
            }
            if (string.IsNullOrEmpty(txtImportePagar.Text))
            {
                resultado = false;
                error.SetError(btnSeleccionarCupones, "Debe agregar un detalle a la Liquidación.");
                return resultado;
            }

            return resultado;
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarForm() == true)
            {
                DialogResult dialog = MessageBox.Show("Se va a generar una Liquidación, esta seguro?", "Información", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dialog == System.Windows.Forms.DialogResult.Yes)
                {
                    try
                    {
                        CobradorLiquidacion liquidacion = new CobradorLiquidacion();
                        liquidacion.cobrador_id = Convert.ToInt32(cmbCobrador.SelectedValue);
                        liquidacion.estado = "I";
                        liquidacion.fecha_liquidacion = DateTime.Now;
                        liquidacion.total = Convert.ToInt32(txtImportePagar.Text.Remove(0, 1));

                        liquidacion.detalle = CrearDetalleLiquidacion();

                        int resultado = CobradoresLiquidaciones.Add(liquidacion);
                        if (resultado > 0)
                        {
                            MessageBox.Show("Los datos se registraron correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            LimpiarControles();
                            GenerarReporte(resultado);
                        }
                        else
                        {
                            MessageBox.Show("Ocurrio un error al registrar los datos. Intente Nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
            }
        }


        private void GenerarReporte(int liquidacion_id)
        {
            frmCobradorLiquidacionReporte frm = new frmCobradorLiquidacionReporte(liquidacion_id);
            frm.MdiParent = this.MdiParent;
            frm.Show();
        }


        private void LimpiarControles()
        {
            dgvCupones.Rows.Clear();
            txtCantidadCupones.Text = string.Empty;
            txtImporteCupones.Text = string.Empty;
            txtImportePagar.Text = string.Empty;

            cmbCobrador.Enabled = true;
        }


        private List<CobradorLiquidacionDetalle> CrearDetalleLiquidacion()
        {
            List<CobradorLiquidacionDetalle> detalle_liquidacionL = new List<CobradorLiquidacionDetalle>();
            try
            {
                foreach (var fila in cobrosL)
                {
                    CobradorLiquidacionDetalle detalle = new CobradorLiquidacionDetalle();
                    detalle.cobradorcobro_id = fila.id;
                    detalle.comision = fila.comision;

                    detalle_liquidacionL.Add(detalle);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return detalle_liquidacionL;
        }

    }
}
